/* eslint-disable no-unused-vars */
/* eslint-disable no-undef */
'use strict';

// eslint-disable-next-line no-unused-vars
const { data } = require('jquery');
const { registerUserNameNotExistInfo, registerFailInfo, changeInfoFailInfo } = require('../utils/ErrorModel');
const { SuccessModel, ErrorModel } = require('../utils/resultModel');

const Controller = require('egg').Controller;

class UserController extends Controller {
  // 获取登录信息
  getUserInfo() {
    let data = {
      isLogin: false, // 初始默认时未登录状态
    };
    // 如果用户已经登录
    const userInfo = this.ctx.session.userInfo;
    if (userInfo) {
      data = {
        isLogin: true,
        userName: userInfo.userName,
      };
    }
    return data;
  }

  // 登录页面
  async loginPage() {
    await this.ctx.render('login.html', this.getUserInfo());
  }

  // 注册页面
  async registerPage() {
    await this.ctx.render('register.html', this.getUserInfo());
  }

  // 个人设置页面
  async settingPage() {
    const userInfo = this.ctx.session.userInfo;
    await this.ctx.render('setting.html', {
      isNav: true,
      userInfo,
    });
  }

  // 注册
  async register() {
    // 获取到数据 用户名 密码  性别
    const { userName, password, gender } = this.ctx.request.body;
    // 在service中做业务处理
    // try ...catch 当语法错误时 会抛出异常(catch) 而不是终止服务
    try {
      // eslint-disable-next-line no-unused-vars
      const result = await this.service.user.createUser({
        userName,
        password,
        gender,
      });

      // 注册成功 自己关注自己 方便首页获取关注人的博客列表
      await this.service.userRelation.addFollower(
        result.id,
        result.id,
      );

      // 当注册成功时 什么都不返回
      this.ctx.body = new SuccessModel();
    } catch (err) {
      // 打印错误信息 错误栈
      console.log(err.message, err.stack);
      return new ErrorModel(registerFailInfo);
    }

  }
  // 用户名是否存在
  async isExist() {
    const { userName } = this.ctx.request.body;
    // service
    const getUserInfo = await this.service.user.getUserInfo(userName);

    console.log(getUserInfo);

    if (getUserInfo) {
      // 成功时直接返回 不需要传递数据 {errno:0,data:{}}
      this.ctx.body = new SuccessModel();
    } else {
      this.ctx.body = new ErrorModel(registerUserNameNotExistInfo);
    }
  }

  // 登录
  async login() {
    // 获取前端请求的用户名和密码
    const { userName, password } = this.ctx.request.body;
    const userInfo = await this.service.user.doLogin({ userName, password });
    this.ctx.body = userInfo;
  }

  // 删除当前用户
  async deleteCurrentUser() {
    // 单元测试的情况下执行删除
    if (this.app.config.env === 'unittest') {
      // 在session中获取用户信息
      if (this.ctx.session && this.ctx.session.userInfo) {
        const { userName } = this.ctx.session.userInfo;
        // 在service中删除用户信息
        const result = await this.service.user.deleteCurrentUser(userName);
        this.ctx.body = result;
      }
    }
  }

  // 更改用户基本信息
  async changeUserInfo() {
    // 获取数据 昵称 城市图片地址
    const { nickName, city, avatar } = this.ctx.request.body;

    // 获取用户名 被更改人
    const { userName } = this.ctx.session.userInfo;
    // 调用service中的 updateUser(更新后的值 查询条件) 方法
    const result = await this.service.user.updateUser({
      newNickName: nickName,
      newCity: city,
      newAvatar: avatar,
    }, { userName });

    // this.ctx.body = result;
    if (result) {
      Object.assign(this.ctx.session.userInfo, {
        nickName,
        city,
        avatar,
      });
      this.ctx.body = new SuccessModel();
    } else {
      this.ctx.body = new ErrorModel(changeInfoFailInfo);
    }
  }

  // 更改密码
  async changePassword() {
    // 获取密码 用户名
    const { userName } = this.ctx.session.userInfo;
    const { newPassword, oldPassword } = this.ctx.request.body;

    // 将数据交给service 处理
    const result = await this.service.user.updateUser({ newPassword }, { userName, password: oldPassword });

    // this.ctx.body = result;

    if (result) {
      this.ctx.body = new SuccessModel();
    } else {
      this.ctx.body = new ErrorModel(changeInfoFailInfo);
    }
  }

  async logout() {
    // 在session中删除用户信息
    delete this.ctx.session.userInfo;
    this.ctx.body = new SuccessModel();
  }
}
module.exports = UserController;
